#ifndef _MSC_MEM_H_
#define _MSC_MEM_H_

#include "stdint.h"
	 
#ifndef NULL
#define NULL 0
#endif

#define SRAMBANK 	2	//定义支持的内存池块数.	

//定义三个内存池
#define SRAMIN	 0		//内部内存池
#define SRAMCCM  1		//CCM内存池(此部分SRAM仅仅CPU可以访问!!!)
//#define SRAMEX   2		//外部内存池

//mem1内存参数设定.mem1完全处于内部SRAM里面.
#define MEM1_BLOCK_SIZE			32  	  						//内存块大小为32字节
#define MEM1_MAX_SIZE			(64*1024)  						//最大管理内存 64K
#define MEM1_ALLOC_TABLE_SIZE	(MEM1_MAX_SIZE/MEM1_BLOCK_SIZE) //内存表大小

//mem2内存参数设定.mem2处于CCM,用于管理CCM(特别注意,这部分SRAM,仅CPU可以访问!!)
#define MEM2_BLOCK_SIZE			32  	  						//内存块大小为32字节
#define MEM2_MAX_SIZE			(32*1024)  						//最大管理内存 32K
#define MEM2_ALLOC_TABLE_SIZE	MEM2_MAX_SIZE/MEM2_BLOCK_SIZE 	//内存表大小
 
//mem3内存参数设定.mem3的内存池处于外部SRAM里面
//#define MEM3_BLOCK_SIZE			32  	  					//内存块大小为32字节
//#define MEM3_MAX_SIZE			960 *1024  						//最大管理内存960K
//#define MEM3_ALLOC_TABLE_SIZE	MEM3_MAX_SIZE/MEM3_BLOCK_SIZE 	//内存表大小
 

//内存管理控制器
struct _msc_mem_dev
{
	void (*init)(uint8_t);					//初始化
	uint8_t (*perused)(uint8_t);		  	//内存使用率
	uint8_t *membase[SRAMBANK];				//内存池 管理SRAMBANK个区域的内存
	uint16_t *memmap[SRAMBANK]; 			//内存管理状态表
	uint8_t  memrdy[SRAMBANK]; 				//内存管理是否就绪
};
extern struct _msc_mem_dev msc_mem_dev;	    //在msc_mem.c里面定义

void mscMemSet(void *s,uint8_t c,uint32_t count);	//设置内存
void mscMemCpy(void *des,void *src,uint32_t n);     //复制内存     
uint32_t mscMemMalloc(uint8_t memx,uint32_t size);	//内存分配(内部调用)
uint8_t mscMemFree(uint8_t memx,uint32_t offset);	//内存释放(内部调用)

void mscMemInit(uint8_t memx);				            //内存管理初始化函数(外/内部调用)
uint8_t mscMemPerused(uint8_t memx);				    //获得内存使用率(外/内部调用) 
void mscFree(uint8_t memx,void *ptr);  			        //内存释放(外部调用)
void *mscMalloc(uint8_t memx,uint32_t size);			//内存分配(外部调用)
void *mscRealloc(uint8_t memx,void *ptr,uint32_t size); //重新分配内存(外部调用)

#endif













